package cn.cmeizu.spring6;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author cmeizu
 * @date 2023/2/12 01:10
 */
public class ProxyFactory {
  /**
   * 目标对象传递
   */
  private Object target;

  public ProxyFactory(Object target) {
    this.target = target;
  }

  //创建一个方法返回代理对象
  public Object getProxy() {
    /**
     * 第一个参数: ClassLoader loader    加载动态生成类的类加载器
     * 第二个参数: Class<?>[] interfaces 目标对象实现的所有接口的class类型的数组
     * 第三个参数: InvocationHandler h   设置代理对象实现目标对象方法的过程
     */
    ClassLoader classLoader = target.getClass().getClassLoader();
    Class<?>[] interfaces = target.getClass().getInterfaces();
    InvocationHandler invocationHandler = new InvocationHandler() {
      /**
       * @param proxy 代理对象
       * @param method 目标对象中的方法
       * @param args 调用method方法中的参灵敏
       * @throws Throwable
       */
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //调用目标的方法
        System.out.println("【动态代理日志】调用之前:" + method.getName() + "，参数" + Arrays.toString(args));
        Object result = method.invoke(target, args);
        System.out.println("【动态代理日志】调用之后:" + method.getName() + "，结果" + result);
        return result;
      }
    };
    return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
  }
}
